package com.canyou.basic.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.canyou.basic.entity.media.MediaVO;
import com.canyou.basic.model.Media;
import com.canyou.enums.MediaStoreTypeEnum;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

/**
 * <p>
 * 上传文件资源表 服务类
 * </p>
 *
 * @author canyou
 * @since 2020-02-13
 */
public interface MediaService extends IService<Media> {

    /**
     * 根据文件id构建资源访问路径
     *
     * @param request
     * @param mediaId 文件id
     * @return
     */
    String getMediaPath(final HttpServletRequest request, Long mediaId);

    /**
     * 根据文件id构建资源可直接访问url
     *
     * @param request
     * @param mediaId
     * @return
     */
    String getMediaUrl(final HttpServletRequest request, Long mediaId);

    /**
     * 根据文件id构建资源访问路径
     *
     * @param request
     * @param media   资源信息
     */
    void getMediaPath(final HttpServletRequest request, Media media);

    /**
     * 根据文件id构建资源可直接访问url
     *
     * @param request
     * @param media   资源信息
     */
    void getMediaUrl(final HttpServletRequest request, Media media);

    /**
     * 根据文件id str构建资源可直接访问url
     *
     * @param request
     * @param mediaId
     * @return
     */
    String getMediaUrl(final HttpServletRequest request, String mediaId);

    /**
     * 根据资源id集合,获取上传文件信息
     *
     * @param ids 文件id集合
     * @return
     */
    List<MediaVO> getListByIds(List<Long> ids);

    /**
     * 根据ids集合获取文件信息列表, 文件信息带可访问的url
     *
     * @param request 当前request请求
     * @param ids     文件id集合
     * @return
     */
    List<MediaVO> getListWithUrlByIds(final HttpServletRequest request, List<Long> ids);

    /**
     * 保存上传的文件到指定目录
     *
     * @param multipartFile  待保存的文件
     * @param mediaStoreType 资源存储方式(1.本地存储,2.七牛,3.阿里,4.minio)
     * @return
     * @throws IOException
     */
    Media saveFile(MultipartFile multipartFile, MediaStoreTypeEnum mediaStoreType) throws IOException;

    /**
     * 保存文件到上传文件指定目录,并在sys_media表生成文件的相关信息
     *
     * @param file 待保存的文件
     * @return 保存的文件信息
     * @throws FileNotFoundException
     */
    Media saveFile(File file) throws FileNotFoundException;

    /**
     * 保存文件到上传文件指定目录,并在sys_media表生成文件的相关信息
     *
     * @param file           待保存的文件
     * @param fileName       原始文件名
     * @param mediaStoreType 资源存储方式(1.本地存储,2.七牛,3.阿里,4.minio)
     * @return 保存的文件信息
     * @throws FileNotFoundException
     */
    Media saveFile(File file, String fileName, MediaStoreTypeEnum mediaStoreType) throws FileNotFoundException;

    /**
     * 文件下载
     *
     * @param response
     * @param file         待下载的文件
     * @param fileName     要显示的下载文件名
     * @param contentType  文件类型
     * @param isAttachment 是否作为附件的方式, 不使用浏览器预览
     * @param isMsBrowser  是否是ie浏览器
     * @throws IOException
     */
    void download(HttpServletResponse response,
                  File file,
                  String fileName,
                  String contentType,
                  Boolean isAttachment,
                  Boolean isMsBrowser) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param file        待下载的文件
     * @param fileName    要显示的下载文件名
     * @param contentType 文件类型
     * @throws IOException
     */
    void download(HttpServletResponse response,
                  File file,
                  String fileName,
                  String contentType) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param file     待下载的文件
     * @param fileName 要显示的下载文件名
     * @throws IOException
     */
    void download(HttpServletResponse response, File file, String fileName) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param file     待下载的文件
     * @throws IOException
     */
    void download(HttpServletResponse response, File file) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param filePath     待下载的文件路径
     * @param fileName     要显示的下载文件名
     * @param contentType  文件类型
     * @param isAttachment 是否作为附件的方式, 不使用浏览器预览
     * @throws IOException
     */
    void download(HttpServletResponse response,
                  String filePath,
                  String fileName,
                  String contentType,
                  Boolean isAttachment) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param filePath    待下载的文件路径
     * @param fileName    要显示的下载文件名
     * @param contentType 文件类型
     * @throws IOException
     */
    void download(HttpServletResponse response,
                  String filePath,
                  String fileName,
                  String contentType) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param filePath     待下载的文件路径
     * @param fileName     要显示的下载文件名
     * @param contentType  文件类型
     * @param isAttachment 是否作为附件的方式, 不使用浏览器预览
     * @param isMsBrowser  是否是ie浏览器
     * @throws IOException
     */
    void download(HttpServletResponse response,
                  String filePath,
                  String fileName,
                  String contentType,
                  Boolean isAttachment,
                  Boolean isMsBrowser) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param filePath 待下载的文件路径
     * @param fileName 要显示的下载文件名
     * @throws IOException
     */
    void download(HttpServletResponse response, String filePath, String fileName) throws IOException;

    /**
     * 文件下载
     *
     * @param response
     * @param filePath 待下载的文件路径
     * @throws IOException
     */
    void download(HttpServletResponse response, String filePath) throws IOException;

    /**
     * 获取文件上传基础物理路径
     *
     * @return
     * @throws FileNotFoundException
     */
    String getBaseUploadAbsolutePath() throws FileNotFoundException;

    /**
     * 根据文件存储相对路径, 获取上传文件的绝对物理路径
     *
     * @param mediaPath 上传文件存储相对路径
     * @return
     * @throws FileNotFoundException
     */
    String getUploadAbsolutePath(String mediaPath) throws FileNotFoundException;

}
